﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ParasitoLibrary.Core.Entidade;
using ParasitoQuestionApplication.Business.Fachada;

namespace ParasitoQuestionApplication.UserInterface
{
    public partial class FormularioPrincipal : Form
    {
        private IList<Questao> listaQuestao = new BindingList<Questao>();

        public IList<Questao> ListaQuestao
        {
            get { return listaQuestao; }
        }

        public FormularioPrincipal()
        {
            InitializeComponent();

            this.listaQuestao = new BindingList<Questao>(FachadaParasitoQuestion.getInstancia().carregarQuestoes());

            this.configurarCBBs();
            this.configurarDGVQuestoes();

            this.limparCamposFormulario();
        }

        private void configurarCBBs()
        {
            IList<Nivel> listaNiveis = FachadaParasitoQuestion.getInstancia().carregarNiveis();
            IList<Assunto> listaAssunto = FachadaParasitoQuestion.getInstancia().carregarAssuntos();

            this.cbbNivel.DataSource = listaNiveis;
            this.cbbNivel.DisplayMember = "Nome";
            this.cbbNivel.ValueMember = "Codigo";

            this.cbbAssunto.DataSource = listaAssunto;
            this.cbbAssunto.DisplayMember = "Nome";
            this.cbbAssunto.ValueMember = "Codigo";

        }

        private void configurarDGVQuestoes()
        {
            this.dgvQuestoes.AutoGenerateColumns = false;
            this.dgvQuestoes.DataSource = this.ListaQuestao;
            this.dgvQuestoes.ShowEditingIcon = false;
            this.dgvQuestoes.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            this.dgvQuestoes.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            this.dgvQuestoes.ReadOnly = true;
            this.dgvQuestoes.RowHeadersVisible = false;
            this.dgvQuestoes.ScrollBars = ScrollBars.Vertical;
            this.dgvQuestoes.MultiSelect = false;
            this.dgvQuestoes.AllowUserToAddRows = false;
            this.dgvQuestoes.AllowUserToDeleteRows = false;
            this.dgvQuestoes.AllowUserToResizeColumns = false;
            this.dgvQuestoes.AllowUserToResizeRows = false;
            this.dgvQuestoes.AllowUserToOrderColumns = true;

            DataGridViewTextBoxColumn tbcNivel = new DataGridViewTextBoxColumn();
            tbcNivel.DataPropertyName = "NivelNome";
            tbcNivel.HeaderText = "Nível";
            tbcNivel.ReadOnly = true;
            tbcNivel.FillWeight = 0.1F;
            tbcNivel.SortMode = DataGridViewColumnSortMode.Automatic;
            this.dgvQuestoes.Columns.Add(tbcNivel);

            DataGridViewTextBoxColumn tbcAssunto = new DataGridViewTextBoxColumn();
            tbcAssunto.DataPropertyName = "AssuntoNome";
            tbcAssunto.HeaderText = "Assunto";
            tbcAssunto.ReadOnly = true;
            tbcAssunto.FillWeight = 0.2F;
            tbcAssunto.SortMode = DataGridViewColumnSortMode.Automatic;
            this.dgvQuestoes.Columns.Add(tbcAssunto);

            DataGridViewTextBoxColumn tbcEnunciado = new DataGridViewTextBoxColumn();
            tbcEnunciado.DataPropertyName = "Enunciado";
            tbcEnunciado.HeaderText = "Enunciado";
            tbcEnunciado.ReadOnly = true;
            tbcEnunciado.FillWeight = 0.7F;
            tbcEnunciado.SortMode = DataGridViewColumnSortMode.Automatic;
            this.dgvQuestoes.Columns.Add(tbcEnunciado);
        }

        private void lblAssunto_Enter(object sender, EventArgs e)
        {
            this.cbbAssunto.Focus();
        }

        private void btnPesquisar_Click(object sender, EventArgs e)
        {
            Nivel nivel = null;
            Assunto assunto = null;

            if ( this.cbbNivel.SelectedItem != null ) {
                nivel = (Nivel) this.cbbNivel.SelectedItem;                
            }

            if (this.cbbAssunto.SelectedItem != null)
            {
                assunto = (Assunto)this.cbbAssunto.SelectedItem;
            }

            this.listaQuestao = new BindingList<Questao>(FachadaParasitoQuestion.getInstancia().carregarQuestoes(nivel, assunto, this.txbPergunta.Text));            
            this.dgvQuestoes.DataSource = this.ListaQuestao;

            if (this.listaQuestao == null || this.listaQuestao.Count <= 0)
            {
                MessageBox.Show(this, "Nenhum registro encontrado!");
            }
        }

        

        private void limparCamposFormulario()
        {
            this.cbbNivel.SelectedItem = null;
            this.cbbAssunto.SelectedItem = null;
            this.txbPergunta.Text = "";

            this.listaQuestao = new BindingList<Questao>(FachadaParasitoQuestion.getInstancia().carregarQuestoes());
            this.dgvQuestoes.DataSource = this.ListaQuestao;
        }

        private void btnLimpar_Click(object sender, EventArgs e)
        {
            this.limparCamposFormulario();
        }

        private void btnIncluir_Click(object sender, EventArgs e)
        {
            Questao questao = null;
            FormularioEdicaoPergunta formularioEdicaoPergunta = new FormularioEdicaoPergunta(ref this.listaQuestao, ref questao, EdicaoPerguntaEnum.Inclusao);
            formularioEdicaoPergunta.ShowDialog(this);
        }

        private void btnDetalhar_Click(object sender, EventArgs e)
        {
            if (this.isLinhaSelecionada())
            {
                Questao questao = null;
                questao = this.ListaQuestao.ElementAt(this.dgvQuestoes.SelectedRows[0].Index);
                FormularioEdicaoPergunta formularioEdicaoPergunta = new FormularioEdicaoPergunta(ref this.listaQuestao, ref questao, EdicaoPerguntaEnum.Detalhamento);
                formularioEdicaoPergunta.ShowDialog(this);
            }
            
        }

        private Boolean isLinhaSelecionada()
        {
            Boolean valorRetorno = false;
            if (this.dgvQuestoes.SelectedRows.Count > 0)
            {
                valorRetorno = true;
            }
            else
            {
                MessageBox.Show(this, "É necessário selecionar um registro!");
            }

            return valorRetorno;
        }

        private void btnAlterar_Click(object sender, EventArgs e)
        {
            if (this.isLinhaSelecionada())
            {
                Questao questao = null;
                questao = this.ListaQuestao.ElementAt(this.dgvQuestoes.SelectedRows[0].Index);
                FormularioEdicaoPergunta formularioEdicaoPergunta = new FormularioEdicaoPergunta(ref this.listaQuestao, ref questao, EdicaoPerguntaEnum.Alteracao);
                formularioEdicaoPergunta.ShowDialog(this);
            }
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            if (this.isLinhaSelecionada())
            {
                Questao questao = null;
                questao = this.ListaQuestao.ElementAt(this.dgvQuestoes.SelectedRows[0].Index);
                FormularioEdicaoPergunta formularioEdicaoPergunta = new FormularioEdicaoPergunta(ref this.listaQuestao, ref questao, EdicaoPerguntaEnum.Exclusao);
                formularioEdicaoPergunta.ShowDialog(this);
            }
        }

        private void btnExportar_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveFileDialog = new SaveFileDialog();

            saveFileDialog.DefaultExt = "txt";
            saveFileDialog.Filter = "XML file (*.xml)|*.xml";
            saveFileDialog.AddExtension = true;
            saveFileDialog.RestoreDirectory = true;
            saveFileDialog.Title = "Selecione o arquivo a ser criado";
            saveFileDialog.InitialDirectory = @"C:/";

            if (saveFileDialog.ShowDialog(this) == DialogResult.OK)
            {               
                FachadaParasitoQuestion.getInstancia().exportarQuestoes(saveFileDialog.FileName);
                MessageBox.Show(this, "Perguntas exportadas com  sucesso!");
            }

            saveFileDialog.Dispose();
            saveFileDialog = null;
        }

        private void btnImportar_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();

            openFileDialog.DefaultExt = "txt";
            openFileDialog.Filter = "XML file (*.xml)|*.xml";
            openFileDialog.AddExtension = true;
            openFileDialog.RestoreDirectory = true;
            openFileDialog.Title = "Selecione o arquivo a ser importado";
            openFileDialog.InitialDirectory = @"C:/";

            if (openFileDialog.ShowDialog(this) == DialogResult.OK)
            {
                FachadaParasitoQuestion.getInstancia().importarQuestoes(openFileDialog.FileName);
                MessageBox.Show(this, "Perguntas importadas com  sucesso!");
            }

            openFileDialog.Dispose();
            openFileDialog = null;
        }

    }
}

